/*************************************************************************/
/*  resource_preloader.cpp                                               */
/*************************************************************************/
/*                       This file is part of:                           */
/*                           GODOT ENGINE                                */
/*                    http://www.godotengine.org                         */
/*************************************************************************/
/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur.                 */
/*                                                                       */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the       */
/* "Software"), to deal in the Software without restriction, including   */
/* without limitation the rights to use, copy, modify, merge, publish,   */
/* distribute, sublicense, and/or sell copies of the Software, and to    */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions:                                             */
/*                                                                       */
/* The above copyright notice and this permission notice shall be        */
/* included in all copies or substantial portions of the Software.       */
/*                                                                       */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
/*************************************************************************/
#include "resource_preloader.h"

void ResourcePreloader::_set_resources(const Array& p_data) {

	resources.clear();

	ERR_FAIL_COND(p_data.size()!=2);
	DVector<String> names=p_data[0];
	Array resdata=p_data[1];

	ERR_FAIL_COND(names.size()!=resdata.size());

	for(int i=0;i<resdata.size();i++) {

		String name=names[i];
		RES resource = resdata[i];
		ERR_CONTINUE( !resource.is_valid() );
		resources[name]=resource;

		//add_resource(name,resource);
	}

}

Array ResourcePreloader::_get_resources() const {

	DVector<String> names;
	Array arr;
	arr.resize(resources.size());
	names.resize(resources.size());

	Set<String> sorted_names;

	for(Map<StringName,RES >::Element *E=resources.front();E;E=E->next()) {
		sorted_names.insert(E->key());
	}

	int i=0;
	for(Set<String>::Element *E=sorted_names.front();E;E=E->next()) {

		names.set(i,E->get());
		arr[i]=resources[E->get()];
		i++;
	}

	Array res;
	res.push_back(names);
	res.push_back(arr);
	return res;
}


void ResourcePreloader::add_resource(const StringName& p_name,const RES& p_resource) {


	ERR_FAIL_COND(p_resource.is_null());
	if (resources.has(p_name)) {


		StringName new_name;
		int idx=2;

		while(true) {

			new_name=p_name.operator String()+" "+itos(idx);
			if (resources.has(new_name)) {
				idx++;
				continue;
			}

			break;

		}

		add_resource(new_name,p_resource);
	} else {

		resources[p_name]=p_resource;
	}



}

void ResourcePreloader::remove_resource(const StringName& p_name) {

	ERR_FAIL_COND( !resources.has(p_name) );
	resources.erase(p_name);

}
void ResourcePreloader::rename_resource(const StringName& p_from_name,const StringName& p_to_name) {

	ERR_FAIL_COND( !resources.has(p_from_name) );

	RES res = resources[p_from_name];

	resources.erase(p_from_name);
	add_resource(p_to_name,res);



}

bool ResourcePreloader::has_resource(const StringName& p_name) const {

	return resources.has(p_name);
}
RES ResourcePreloader::get_resource(const StringName& p_name) const {

	ERR_FAIL_COND_V(!resources.has(p_name),RES());
	return resources[p_name];
}

DVector<String> ResourcePreloader::_get_resource_list() const {

	DVector<String> res;
	res.resize(resources.size());
	int i=0;
	for(Map<StringName,RES >::Element *E=resources.front();E;E=E->next(),i++) {
		res.set(i,E->key());
	}

	return res;
}

void ResourcePreloader::get_resource_list(List<StringName> *p_list) {

	for(Map<StringName,RES >::Element *E=resources.front();E;E=E->next()) {

		p_list->push_back(E->key());
	}

}


void ResourcePreloader::_bind_methods() {

	ObjectTypeDB::bind_method(_MD("_set_resources"),&ResourcePreloader::_set_resources);
	ObjectTypeDB::bind_method(_MD("_get_resources"),&ResourcePreloader::_get_resources);

	ObjectTypeDB::bind_method(_MD("add_resource","name","resource"),&ResourcePreloader::add_resource);
	ObjectTypeDB::bind_method(_MD("remove_resource","name"),&ResourcePreloader::remove_resource);
	ObjectTypeDB::bind_method(_MD("rename_resource","name","newname"),&ResourcePreloader::rename_resource);
	ObjectTypeDB::bind_method(_MD("has_resource","name"),&ResourcePreloader::has_resource);
	ObjectTypeDB::bind_method(_MD("get_resource","name"),&ResourcePreloader::get_resource);
	ObjectTypeDB::bind_method(_MD("get_resource_list"),&ResourcePreloader::_get_resource_list);


	ADD_PROPERTY( PropertyInfo(Variant::ARRAY,"resources",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR), _SCS("_set_resources"), _SCS("_get_resources"));

}

ResourcePreloader::ResourcePreloader()
{
}
